/* Copyright (c) 2016-2020 Enfry Ltd. All Rights Reserved.
 * 
 * This software is the confidential and proprietary information of Enfry. 
 * You shall not disclose such Confidential Information
 * and shall use it only in accordance with the terms of the agreements
 * you entered into with Enfry.
 */
package com.enfry.common.util.validate;

import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import com.enfry.common.util.String.Strings;
import com.enfry.common.util.constants.RegexpConstants;

/**
 * <请简单说明此类用途>
 * @Title com.enfry.common.util.validate.Validatex
 * @author longguangxing
 * @date 2018年9月10日
 */
public class Validatex implements RegexpConstants{

	/**
     * 正则表达式验证
     * 
     * @param regexp    正则表达式
     * @param value     需要验证的值
     * @return =true表示成功,=false表示失败
     */
    public static boolean isRegexp(String regexp, String value, boolean allowEmpty)
    {
        if (StringUtils.isEmpty(value))
            return allowEmpty;
        
        regexp = Strings.trim(regexp, "/", "/");
        return Pattern.matches(regexp, value);
    }
    
    /**
     * 是否是布尔型 true|false
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isBoolean(String value, boolean allowEmpty)
    {
        if (Validates.isEmpty(value))
            return allowEmpty;
        
        return "true".equals(value) || "false".equals(value);
    }
    
    /**
     * 是否是数字
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isNumeric(String value, boolean allowEmpty)
    {
        return isRegexp(NUMERIC, value, allowEmpty);
    }
    
    /**
     * 是否整数，包括(正整数、负整数、0)，支持+-号
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isInteger(String value, boolean allowEmpty)
    {
        return isRegexp(INTEGER, value, allowEmpty);
    }
    
    /**
     * 是否正整数，包括(>0的整数)，不支持+号，全数字
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isIntegerPositive(String value, boolean allowEmpty)
    {
        return isRegexp(INTEGER_P, value, allowEmpty);
    }
    
    /**
     * 是否负整数，包括(<0的整数)，-号开头，再[1-9]，再[0-9]*
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isIntegerNegative(String value, boolean allowEmpty)
    {
        return isRegexp(INTEGER_N, value, allowEmpty);
    }
    
    /**
     * 是否非负整数，包括(>=0的整数)，不支持+号，全数字
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isIntegerNonnegative(String value, boolean allowEmpty)
    {
        return isRegexp(INTEGER_N_N, value, allowEmpty);
    }
    
    /**
     * 是否非正整数，包括(<=0的整数)，负数必须-号开头
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isIntegerNonpositive(String value, boolean allowEmpty)
    {
        return isRegexp(INTEGER_N_P, value, allowEmpty);
    }
    
    /**
     * 是否是字母组合
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphabetic(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHABAT, value, allowEmpty);
    }
    
    /**
     * 是否是大写字母组合
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphabeticUppercase(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHABAT_UPPER, value, allowEmpty);
    }
    
    /**
     * 是否是小写字母组合
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphabeticLowercase(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHABAT_LOWER, value, allowEmpty);
    }
    
    /**
     * 是否是字母和数字组合
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphaNumeric(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHA_NUMERIC, value, allowEmpty);
    }
    
    /**
     * 是否是字母和数字组合，字母开头
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphaNumericPA(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHA_NUMERIC_PA, value, allowEmpty);
    }
    
    /**
     * 是否是字母和数字组合，字母或下划线开头，java命名规则
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphaNumericUlPA(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHA_NUMERIC_UL_PA, value, allowEmpty);
    }
    
    /**
     * 是否是字母和数字组合，字母或下划线或$开头，js命名规则
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphaNumericUlDlPA(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHA_NUMERIC_UL_DL_PA, value, allowEmpty);
    }
    
    /**
     * 是否是大写字母和数字组合
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphaUpperNumeric(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHA_UPPER_NUMERIC, value, allowEmpty);
    }
    
    /**
     * 是否是小写字母和数字组合
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAlphaLowerNumeric(String value, boolean allowEmpty)
    {
        return isRegexp(ALPHA_LOWER_NUMERIC, value, allowEmpty);
    }
    
    /**
     * 是否浮点型，支持多位小数，支持正负号前缀，如-12,-12.3,+12.35,-12.356,12,12.3,12.35,0,0.3,0.35,-0.3,-0.35
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isFloat(String value, boolean allowEmpty)
    {
        return isRegexp(FLOAT, value, allowEmpty);
    }
    
    /**
     * 是否是最长两位小数的金额，支持正负号前缀，如-12,-12.3,+12.35,12,12.3,12.35,0,0.3,0.35,-0.3,-0.35
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isAmount2R(String value, boolean allowEmpty)
    {
        return isRegexp(AMOUNT_2R, value, allowEmpty);
    }
    
    /**
     * 是否是邮箱地址，支持类似于xxx@xxx.xxx的邮箱格式，支持[-_.]等连接符，不支持中文等特殊符号
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isEmail(String value, boolean allowEmpty)
    {
        return isRegexp(EMAIL, value, allowEmpty);
    }
    
    /**
     * 是否是IP地址，支持类似于192.168.1.1/192.168.01.01/192.168.001.001的IP格式
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isIP(String value, boolean allowEmpty)
    {
        return isRegexp(IP, value, allowEmpty);
    }
    
    /**
     * 是否是MAC地址，格式为23:ad:87:be(十六进制)
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isMacAddress(String value, boolean allowEmpty)
    {
        return isRegexp(MAC, value, allowEmpty);
    }
    
    /**
     * 是否是泛手机号码，支持前缀+86,86开头,后面接手机号
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isMobile(String value, boolean allowEmpty)
    {
        return isRegexp(MOBILE, value, allowEmpty);
    }
    
    /**
     * 是否是中国区11位的手机号码
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isMobile11(String value, boolean allowEmpty)
    {
        return isRegexp(MOBILE_11, value, allowEmpty);
    }
    
    /**
     * 是否是日期格式，格式为yyyy-MM-dd
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isDate(String value, boolean allowEmpty)
    {
        return isRegexp(DATE, value, allowEmpty);
    }
    
    /**
     * 是否是时间格式，格式为HH:mm:ss
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isTime(String value, boolean allowEmpty)
    {
        return isRegexp(TIME, value, allowEmpty);
    }
    
    /**
     * 是否是日期时间格式，格式为yyyy-MM-dd HH:mm:ss
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isDateTime(String value, boolean allowEmpty)
    {
        return isRegexp(DATE_TIME, value, allowEmpty);
    }
    
    /**
     * 是否是身份证号，格式为[0-9]{6}yyyyMMdd[0-9]{3}[0-9xX*]，前6位数字，中间8位1900-2099年的日期，末4位为3个数字和[0-9]或xX*。
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isIdcard(String value, boolean allowEmpty)
    {
        return isRegexp(IDCARD, value, allowEmpty);
    }
    
    /**
     * 是否是邮政编码
     * 
     * @param value         需要验证的值
     * @param allowEmpty    是否允许为空
     * @return =true表示成功,=false表示失败
     */
    public static boolean isPostalCode(String value, boolean allowEmpty)
    {
        return isRegexp(POSTAL_CODE, value, allowEmpty);
    }
}
